package com.lianup.noname.processor;

import com.lianup.noname.common.HttpStatusEnum;
import com.lianup.noname.deal.HttpRequest;
import com.lianup.noname.deal.HttpResponse;
import com.lianup.noname.deal.HttpRequestFacade;
import com.lianup.noname.deal.HttpResponseFacade;
import org.apache.catalina.*;

import javax.servlet.Servlet;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

/**
 *用来处理sevlet的请求
 * 把loader单独放在一个类里面了，本来想用Lifecycle来实现一个servlet起，对应的loader起，但是不知道怎么实现事件注册
 * (不知道为啥就是找不到lifecyclesuppoort，内置的tomcat版本就是8.x)
 */
public class ServeletProcessor{

    private SimpleLoader simpleLoader = new SimpleLoader("com.lianup.noname.servlet.");
//    private static final URLClassLoader URL_CLASS_LOADER;
//
//    /**
//     * 注意classloader寻找.class文件的时候，进入项目报名就是文件名的一部分，而不是用/了。
//     */
//    private static final String SERVLET_PACAGE_URL = "com.lianup.noname.servlet.";
//
//    private static final String CLASSES_FILE_URL = "F:/spring/noname/target/classes";
//
//    static {
//        //定位到resouces/servlet文件夹
//        URL serveletClassPath = null;
//        try {
//            serveletClassPath = new File(CLASSES_FILE_URL).toURI().toURL();
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//        URL_CLASS_LOADER = new URLClassLoader(new URL[]{serveletClassPath});
//    }

    public void process(HttpRequest httpRequest, HttpResponse httpResponse){
        String servletName = getServletName(httpRequest.getRequestURI());
        try {
//            Class servletClass = simpleLoader.getURL_CLASS_LOADER().loadClass(SERVLET_PACAGE_URL + servletName);
            Class servletClass = simpleLoader.getServletClass(servletName);
            Servlet servlet = (Servlet)servletClass.newInstance();

            //调用了Response.PrintWriter(我们刚才上面用socket的outputStream封装的)对象向浏览器输出了一个响应头
            // （不这么做chrome会认为这个响应是无效的，servlet回显的内容就看不到了
            httpResponse.getWriter().println(new String(httpResponse.headToByte(HttpStatusEnum.OK)));

            servlet.service(new HttpRequestFacade(httpRequest),new HttpResponseFacade(httpResponse));
            // 这个一定要加上，否则网页会重复请求，并且outpustream.write()不会把内容写到网页上
            httpResponse.finishResponse();
        }catch (Exception e){
            e.printStackTrace();
        }



    }


    private String getServletName(String uri){
        return uri.substring(uri.lastIndexOf("/")+1);
    }


}
